聚合框架
1. 概述
MongoDB 的聚合框架(Aggregation Framework)是一个强大的工具,用于对数据进行复杂的分析和处理。它允许你通过一系列的阶段(stages)来处理数据,每个阶段执行特定的操作,如过滤、分组、排序、计算等。聚合框架非常适合用于数据分析、报表生成和复杂查询。
2. 聚合管道(Aggregation Pipeline)
聚合框架的核心是聚合管道。一个聚合管道由多个阶段组成,每个阶段对输入的文档进行处理,并将结果传递给下一个阶段。最终的结果是所有阶段的组合效果。
2.1 基本语法
聚合管道的基本语法如下:
db.collection.aggregate([
{ $stage1: { ... } },
{ $stage2: { ... } },
...
])
其中,$stage1, $stage2 等是聚合阶段的操作符,每个阶段可以包含不同的参数。
3. 常用聚合阶段
3.1 $match
$match 阶段用于过滤文档,类似于查询操作。它使用查询语法来选择符合条件的文档。
示例:
db.orders.aggregate([
{ $match: { status: "completed" } }
])
这个阶段会过滤出所有 status 为 "completed" 的订单。
3.2 $group
$group 阶段用于分组文档,并对每个分组进行聚合操作。你可以使用 $group 来计算总和、平均值、最大值、最小值等。
示例:
db.orders.aggregate([
{ $group: { _id: "$customer_id", total: { $sum: "$amount" } } }
])
这个阶段会按 customer_id 分组,并计算每个客户的订单总金额。
3.3 $sort
$sort 阶段用于对文档进行排序。你可以按一个或多个字段进行升序或降序排序。
示例:
db.orders.aggregate([
{ $sort: { amount: -1 } }
])
这个阶段会按 amount 字段降序排序订单。
3.4 $project
$project 阶段用于选择或排除字段,类似于查询中的字段选择。你还可以使用 $project 来重命名字段或创建新的计算字段。
示例:
db.orders.aggregate([
{ $project: { customer_id: 1, amount: 1, _id: 0 } }
])
这个阶段会只选择 customer_id 和 amount 字段,并排除 _id 字段。
3.5 $unwind
$unwind 阶段用于展开数组字段,将每个数组元素转换为一个单独的文档。
示例:
db.orders.aggregate([
{ $unwind: "$items" }
])
这个阶段会将每个订单中的 items 数组展开,生成多个文档,每个文档对应一个 item。
4. 实践练习
4.1 练习1:计算每个客户的订单总金额
假设你有一个 orders 集合,每个文档包含 customer_id 和 amount 字段。请编写一个聚合管道,计算每个客户的订单总金额。
解决方案:
db.orders.aggregate([
{ $group: { _id: "$customer_id", totalAmount: { $sum: "$amount" } } }
])
4.2 练习2:按订单金额排序并选择前10个订单
假设你有一个 orders 集合,每个文档包含 amount 字段。请编写一个聚合管道,按订单金额降序排序,并选择前10个订单。
解决方案:
db.orders.aggregate([
{ $sort: { amount: -1 } },
{ $limit: 10 }
])
5. 总结
聚合框架是 MongoDB 中一个非常强大的工具,适用于各种复杂的数据处理任务。通过掌握聚合管道的各个阶段,你可以轻松地进行数据分析、报表生成和复杂查询。希望本教程能帮助你更好地理解和使用 MongoDB 的聚合框架。
6. 下一步
在掌握了聚合框架的基础知识后,你可以进一步学习如何使用聚合框架进行更复杂的操作,如嵌套聚合、使用 $lookup 进行表连接、以及如何优化聚合管道的性能。